package com.example.code.wzsb;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.ImageHelper;
import org.apache.pdfbox.io.RandomAccessBuffer;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 文字识别
 */
public class Main {

    public static void main(String[] args) throws Exception {
        String toTxt = pdfToTxt("D:\\DATA\\Documents\\常用上传文件\\[XDF23124] 专利申请前评估服务采购 (快速采购).docx.pdf");

        System.out.println(toTxt);
    }


    public static String pdfToTxt(String pdfFilePath) throws Exception {

            String text = "";
            FileInputStream fis = null;
            PDDocument document = null;

            try {
                fis = new FileInputStream(pdfFilePath);
                PDFParser parser = new PDFParser(new RandomAccessBuffer(fis));
                parser.parse();
                document = parser.getPDDocument();
                PDFTextStripper stripper = new PDFTextStripper();
                text = stripper.getText(document);
            } catch (Exception var9) {
                throw new Exception("pdf转文本失败，错误信息：" + var9.getMessage());
            } finally {
                if (fis != null) {
                    fis.close();
                }

                if (document != null) {
                    document.close();
                }

            }

            return text;
    }

    public static void main2() throws IOException {
        // 识别图片的文件（修改为自己的图片路径）
        String imagePath = "D:\\DATA\\Pictures\\Feedback\\1008158e4525b24e6a67f8be5f32f1b7.png";

        System.out.println("imagePath:" + imagePath);
        File file = new File(imagePath);

        // 图片转图片流
        BufferedImage img = ImageIO.read(file);

        // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
        img = ImageHelper.convertImageToGrayscale(img);

        // 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
        img = ImageHelper.convertImageToBinary(img);

        // 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
        img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);

        ITesseract instance = new Tesseract();



        instance.setOcrEngineMode(1); // 设置OCR引擎模式（OEM）
        instance.setPageSegMode(6);   // 设置图片分割模式（PSM）


//        instance.setDatapath(path);
        instance.setDatapath( "E:\\tessdata");

        //chi_sim ：简体中文， eng    根据需求选择语言库
        instance.setLanguage("chi_sim");
        String result = null;
        try {
            long startTime = System.currentTimeMillis();
            result = instance.doOCR(img);
            long endTime = System.currentTimeMillis();
            System.out.println("Time is：" + (endTime - startTime) + " 毫秒");
        } catch (TesseractException e) {
            e.printStackTrace();
        }

        System.out.println("result: " + result);
    }


    public static void wzsb(){
        // 识别图片的路径（修改为自己的图片路径）
        String path = "D:\\DATA\\Pictures\\Feedback\\1008158e4525b24e6a67f8be5f32f1b7.png";

        // 语言库位置（修改为跟自己语言库文件夹的路径）
        String lagnguagePath = "E:\\tessdata";

        File file = new File(path);
        ITesseract instance = new Tesseract();

        //设置训练库的位置
        instance.setDatapath(lagnguagePath);
        //设置语言 -->简体中文
//        instance.setLanguage("chi_sim");
        //chi_sim ：简体中文， eng    根据需求选择语言库
        instance.setLanguage("chi_sim");
        String result = null;
        try {
            long startTime = System.currentTimeMillis();
            result = instance.doOCR(file);
            long endTime = System.currentTimeMillis();
            System.out.println("Time is：" + (endTime - startTime) + " 毫秒");
        } catch (TesseractException e) {
            e.printStackTrace();
        }

        System.out.println("result: ");
        System.out.println(result);
    }
}
